package com.atguigu.cloud.apis;

import com.atguigu.cloud.entities.PayDTO;
import com.atguigu.cloud.resp.ResultData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author bairimengchang
 * @version 1.0
 * @project cloud2024
 * @description 对外暴露的服务接口，理解：Feign通过动态代理实现了之前RestTemplate的功能，对繁琐的配置进行了封装
 * 这里看作80消费者与8001生产者的中间层，方便调用
 * @date 2024/9/14
 */
// 相当于替代了消费者80的public static final String PaymentSrv_URL = "http://cloud-payment-service";
//@FeignClient(value = "cloud-payment-service")
@FeignClient(value = "cloud-gateway") // 通过8001网关服务再进行调用
public interface PayFeignApi {

    // 新增订单（调用此接口增加一条流水）
    @PostMapping(value = "/pay/add")
    ResultData<String> addPay(@RequestBody PayDTO payDTO);

    // 删除订单（调用此接口删除一条流水）
    @DeleteMapping(value = "/pay/del/{id}")
    ResultData<Integer> deletePay(@PathVariable("id") Integer id);

    // 修改订单信息（调用此接口修改流水信息）
    @PutMapping(value = "/pay/update")
    ResultData<String> updatePay(@RequestBody PayDTO payDTO);

    // 根据流水号查询订单的流水信息（调用此接口根据流水id查询流水信息）
    @GetMapping(value = "/pay/get/{id}")
    ResultData<PayDTO> getById(@PathVariable("id") Integer id);

    // 查询所有订单信息流水信息（调用此接口查询所有流水信息）
    @GetMapping(value = "/pay/getAll")
    ResultData<List<PayDTO>> getAll();

    // 测试异常
    @GetMapping(value = "/pay/error")
    ResultData<Integer> getPayError();

    // 测试负载均衡
    @GetMapping(value = "/pay/get/info")
    String getInfoByConsul();

    // 测试链路熔断
    @GetMapping(value = "/pay/circuit/{id}")
    String myCircuit(@PathVariable("id") Integer id);

    // 测试舱壁隔离
    @GetMapping(value = "/pay/bulkhead/{id}")
    String myBulkhead(@PathVariable("id") Integer id);

    // 测试限流
    @GetMapping(value = "/pay/ratelimit/{id}")
    String myRatelimit(@PathVariable("id") Integer id);

    // 链路监控
    @GetMapping(value = "/pay/micrometer/{id}")
    String myMicrometer(@PathVariable("id") Integer id);

    /**
     * GateWay进行网关测试案例01
     */
    @GetMapping(value = "/pay/gateway/get/{id}")
    ResultData<PayDTO> getById2(@PathVariable("id") Integer id);

    /**
     * GateWay进行网关测试案例02
     */
    @GetMapping(value = "/pay/gateway/info")
    ResultData<String> getGatewayInfo();

    /**
     * GateWay进行网关测试案例03
     */
    @GetMapping(value = "/pay/gateway/filter")
    ResultData<String> getGatewayFilter();

}
